Soy bastante nuevo en la programación y me preguntaba por qué este código:
for ( ; *p; ++p) *p = tolower(*p);funciona para reducir un caso de cadena en c, cuando p apunta a una cadena?
En general, este código:
for ( ; *p; ++p) *p = tolower(*p);no
” funciona para bajar un caso de cadena en c, cuando p apunta a una cadena?
Funciona para ASCII puro, pero dado que char generalmente es un tipo con signo, y dado que tolower requiere un argumento no negativo (excepto el valor especial EOF ), la pieza en general tendrá un comportamiento indefinido.
Para evitar eso, envíe el argumento a unsigned char , así:
for ( ; *p; ++p) *p = tolower( (unsigned char)*p ); Ahora puede funcionar para codificaciones de un solo byte como Latin-1, siempre que haya configurado la configuración regional correcta a través de setlocale , por ejemplo, setlocale( LC_ALL, "" ); . Sin embargo, tenga en cuenta que la codificación UTF-8 muy común no es un solo byte por carácter. Para tratar con texto UTF-8, puede convertirlo en una cadena ancha y en minúsculas.
Detalles:
*p es una expresión que denota el objeto al que apunta p , presumiblemente un char .
Como condición de continuación para el ciclo for , cualquier valor de char distinto de cero que denota *p , tiene el efecto de True lógico, mientras que el valor de char cero al final de la cadena tiene el efecto de False lógico, finalizando el ciclo.
++p avanza el puntero para apuntar al siguiente char .
Para desmarcar, supongamos que p es un puntero a un char y justo antes del bucle for , apunta al primer carácter de una cadena.
En C, las cadenas generalmente se modelan mediante un conjunto de valores de caracteres char con un 0 final agregado al final que actúa como el terminador nulo .
*p se evaluará como 0 una vez que se alcance el terminador nulo de la cadena. Entonces el bucle for saldrá. (La segunda expresión en el bucle for actúa como prueba de terminación).
++p avanza al siguiente carácter de la cadena.
*p = tolower(*p) establece ese carácter en minúsculas.